using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FiltronASP.Models.DAO;
using FiltronASP.Models.DAO.Interfaces;
using FiltronASP.Models.Validators;

namespace FiltronASP.Models
{
    /// <summary>
    /// Fragment klasy odpowiadajacy tabeli <code>Variables</code>.
    /// </summary>
    [MetadataType(typeof(VariableValidation))]
    public partial class Variable
    {
        /// <summary>
        /// Metoda pobierajaca wartosc zmiennej dla zadanej strony.
        /// </summary>
        /// <param name="pageId">id strony</param>
        public VariableValue GetVariableValue(int? pageId)
        {
            if (!pageId.HasValue)
            {
                return null;
            }   //if null
            IVariableValueDAO variableValueDAO = new VariableValueDAO();
            return variableValueDAO.FindByVariableAndPage(this.variable_id, pageId.Value);
        }

        /// <summary>
        /// Metoda pobierajaca wartosc zmiennej dla zadanej strony (tylko wartosc, nie caly obiekt).
        /// </summary>
        /// <param name="pageId">id strony</param>
        public string GetVariableValueContent(int? pageId)
        {
            VariableValue variableValue = this.GetVariableValue(pageId);
            if (variableValue != null)
            {
                return variableValue.variable_value;
            }   //if
            return String.Empty;
        }
    }

    /// <summary>
    /// Klasa z walidacja dla niektorych danych klasy <code>Variable</code>.
    /// </summary>
    public class VariableValidation
    {

        [HiddenInput(DisplayValue = false)]
        public int variable_id { get; set; }

        [Required(ErrorMessage = "Nazwa zmiennej jest wymagana.")]
        [StringLength(80, ErrorMessage = "Nazwa zmiennej nie powinna być dłuższa niż 80 znaków.")]
        [AlpaNumeric(ErrorMessage = "Nazwa zmiennej nie powinna zawierać znaków specjalnych.")]
        public string variable_name { get; set; }

        [Required(ErrorMessage = "Typ zmiennej jest wymagany.")]
        public int variable_type_id { get; set; }

        [Required(ErrorMessage = "Informacja na temat możliwości edycji zmiennej jest wymagana.")]
        public bool variable_editable { get; set; }

        [Required(ErrorMessage = "Informacja na temat numeru porządkowego zmiennej jest wymagana.")]
        [NotNegativeNumber(ErrorMessage = "Wprowadzona wartość powinna być nieujemna.")]
        public int variable_ordering { get; set; }

        [Required(ErrorMessage = "Informacja na temat publikacji zmiennej jest wymagana.")]
        public bool variable_published { get; set; }

        [Required(ErrorMessage = "Informacja na temat wersji językowej zmiennej jest wymagana.")]
        public Nullable<int> language_id { get; set; }

        [Required(ErrorMessage = "Informacja na temat szablonu, do którego przypisana jest zmienna jest wymagana.")]
        public Nullable<int> template_id { get; set; }

    }
}
